package com.ht.api.bigtask.impl.qywx;

import com.ht.api.bigtask.BaseBigTask;
import com.ht.api.db.Db;
import com.ht.api.db.DbList;
import com.ht.api.db.Entity;
import com.ht.api.open.OpenUtil;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * 大任务：【企业微信】第二步，获取客服的客户列表
 * @author asq
 * @createTime 2025年1月15日 09:21:41
 */
@Slf4j
public class QueryUserListTask extends BaseBigTask {
	/** 接口ID */
	private static final long API_ID = 1868921751912714240L;
	/** 每次处理数据条数 */
	private static final int PAGE_SIZE = 1;

	@Override
	protected void doExecute(String appId, JSONObject context, Entity bean) {
		// 如果本任务已完成，则不再重复执行
		if (isOver()) {
			log.info("[BigTask]本任务已完成，不再重复执行，任务名：QueryUserListTask，【企业微信】第二步，获取客服的客户列表");
			return;
		}
		long t = System.currentTimeMillis();
		
		// 从上下文中获取上一个任务查询到的客服数组
		JSONArray arr = context.getJSONArray("follow_user");
		
		// 执行自身任务
		int pageNum = getPageNum();
		DbList list = DbList.create();
		do {
	        // 调用接口
	        JSONArray externalContactList = null;
	        JSONObject param = JSONUtil.createObj();
	        param.set("limit", 100);
	        param.set("userid_list", arr.subList(pageNum, Math.min(pageNum + PAGE_SIZE, arr.size())));
			do {
				// 组装接口参数
				String str = OpenUtil.call(appId, API_ID, param, false);
				JSONObject entity = JSONUtil.parseObj(str);
				externalContactList = entity.getJSONArray("external_contact_list");
				
				// 写入租户库的open_data表
				if (!externalContactList.isEmpty()) {
					list.add(createOpenDataEntity(appId, API_ID, entity));
					//Db.insert(getTenantDs(appId), createOpenDataEntity(appId, API_ID, entity));
				} else {
					log.info("[BigTask]批量获取客户详情get_by_user,客服没有客户，不用存储open_data，客服ids:{}", param.toString());
				}
				
				param.set("cursor", entity.getStr("next_cursor"));
			} while(externalContactList.size() == 100);
			
			// 记录任务进度（任务进度是每个任务节点各记各的，互不影响）
			pageNum += PAGE_SIZE;
			saveInfo(PAGE_NUM_NAME, pageNum, bean);
		} while(pageNum < arr.size());
		
		// 批量插入
		Db.insertBatchWithStream(getTenantStreamConfig(appId), list);

		log.info("[BigTask]完成【企业微信】第二步，获取客服的客户列表，耗时：{}ms", (System.currentTimeMillis() - t));
	}
}
